/**
 * 
 */
package cn.biplam.front.template.complex;

import java.util.Map;

import cn.biplam.common.paramters.SysName;
import cn.biplam.common.wrapper.ErrorMessage;
import cn.biplam.common.wrapper.KvMap;
import cn.biplam.front.html.base.HtmlWindow;
import cn.biplam.front.html.base.Const.Window_Event;
import cn.biplam.front.htmlscript.script.AjxScript;
import cn.biplam.front.htmlscript.script.PopupScript;
import cn.biplam.front.htmlscript.script.ValueCheckScript;
import cn.biplam.front.htmlscript.script.AjxScript.Is_SubMitData;
import cn.biplam.front.htmlscript.script.AjxScript.Level;
import cn.biplam.front.htmlscript.script.ValueCheckScript.Check_Type;
import cn.biplam.front.template.Template;
import cn.biplam.front.template.base.HiddenParam;
import cn.biplam.front.template.control.FlatTable;

/**
 * 输入提示窗口(FlatTable布局,放入输入控件)<BR>
 * 用于录入一组数据,确定后然后提交给指定的action
 * 使用方法:
 * 1.创建本模板(传入提交actionid、提交数据主键Id)<BR>
 * 2.putParams放入需要传递给"提交action"的参数<BR>
 * 3.putTd放入输入控件
 * 4.return 本模板.get()<BR>
 * @author 	WangSong 2009-11-10 下午08:52:57
 * @version 1.0
 */
public class InputPrompt implements Template {

	/** 默认当前对象ID */
	private static String defaultCId = "InputPrompt";
	private FlatTable table;
	/** 用于提交的容器ID*/
	private String cID;
	private String actionId;
	private String recordId;
	private Level level;
	private String title;
	private boolean toPopup;
	ValueCheckScript check;
	KvMap<String, String> checks;
	KvMap<String, Check_Type>checkTp;


	/**
	 * 创建输入提示窗口
	 * @param submitActionId 提交动作ID
	 * @param submitRecordId 提交纪录ID
	 * @throws ErrorMessage
	 */
	public InputPrompt(String submitActionId,String submitRecordId) throws ErrorMessage{
		this(submitActionId,submitRecordId,defaultCId);
	}

	/**
	 * 创建输入提示窗口
	 * @param submitActionId 提交动作ID
	 * @param submitRecordId 提交纪录ID
	 * @param cId            当前窗口页面ID
	 * @throws ErrorMessage
	 */
	public InputPrompt(String submitActionId,String submitRecordId,String cId) throws ErrorMessage{
		this.actionId=submitActionId;
		this.recordId=submitRecordId;
		this.cID = cId;
		this.table=new FlatTable(cID,recordId);
		this.checks=new KvMap<String, String>();
		this.checkTp=new KvMap<String, Check_Type>();
	}

	
	/**
	 * 放入一个需要提交给请求组件的数据参数
	 * @param name
	 * @param value
	 * @throws ErrorMessage
	 */
	public void putParam(String name,String value) throws ErrorMessage{
		this.table.putExtend(new HiddenParam(name, value).get());
	}

	/**
	 * 指定单元格行下标和列下标插入html对象到单元格
	 * @param content 要插入对象
	 * @param row  行	
	 * @param col  列
	 * @throws ErrorMessage 
	 */
	public void putTd(HtmlWindow content,int row,int col) throws ErrorMessage{
		this.putTd(content, row, col,null);
	}
	
	/**
	 * 指定单元格行下标和列下标插入html对象到单元格
	 * @param content 要插入对象
	 * @param row  行	
	 * @param col  列
	 * @param colSpan 所占列数
	 */
	public void putTd(HtmlWindow content,int row,int col,String colSpan) throws ErrorMessage{
		this.table.putTd(content, row, col,colSpan);
	}
	
	/**
	 * 指定单元格行下标和列下标插入html对象到单元格
	 * @param content 要插入对象
	 * @param row  行	
	 * @param col  列
	 * @throws ErrorMessage 
	 */
	public void putTh(String content,int row,int col) throws ErrorMessage{
		this.table.putTh(content, row, col);
	}

	/**
	 * 设置确定提交到Popup窗口
	 * @param level		弹出级别
	 * @param title		弹出窗口标题
	 */
	public void setToPopup(Level level,String title){
		this.level=level;
		this.title=title;
		this.toPopup=true;
	}
	
	/**
	 *  放入检查项(空值检查)
	 * @param cName       被检查页面对象ID,不能为空
	 * @param alertInfo 不符合条件时的提示信息
	 * @throws ErrorMessage 
	 */
	public void putCheckItem(String cName,String alertInfo) throws ErrorMessage{
		this.putCheckItem(cName, Check_Type.Empty_check, alertInfo);
	}
	
	/**
	 *  放入检查项
	 * @param cName       被检查页面对象ID,不能为空
	 * @param checkType 检查类型,不能为空
	 * @param alertInfo 不符合条件时的提示信息
	 * @throws ErrorMessage 
	 */
	public void putCheckItem(String cName,Check_Type checkType,String alertInfo) throws ErrorMessage{
		this.checks.put(cName, alertInfo);
		this.checkTp.put(cName, checkType);
	}

	/**
	 * 设置表格占位宽度
	 * @param value  宽度值
	 * @throws ErrorMessage
	 */
	public void setWidth(String value) throws ErrorMessage{
		this.table.setWidth(value);
	}

	/**
	 * 设置列大小(以英文字符数计算,一个中文字符等于2个英文字符)
	 * @param row 行下标
	 * @param col  列下标
	 * @param size 列所占字符数
	 * @throws ErrorMessage 
	 */
	public void setColSize(int row,int col,int size) throws ErrorMessage{
		this.table.setColSize(row, col, size);
	}

	/**
	 * 返回页面对象
	 * @return	HtmlWindow
	 * @throws ErrorMessage
	 */
	public HtmlWindow get() throws ErrorMessage {
		HtmlWindow div = table.get();
		StringBuilder sb = new StringBuilder(PopupScript.cancel(SysName.PromptID));

		if(toPopup){//提交到弹出窗口
			sb.append(AjxScript.getP(
							cID,
							this.actionId,
							this.level,
							Is_SubMitData.Submit,
							this.title));
		}else{//提交到入库
			sb.append(AjxScript.getSpNoRefresh(cID,this.actionId));
		}
		this.check=new ValueCheckScript(cID,sb.toString());
		for(Map.Entry<String, String>ite:this.checks){
			check.putItem(ite.getKey(), checkTp.getByKey(ite.getKey()), ite.getValue());
		}
		div.bind(SysName.PromptSubmitID,Window_Event.OnClick,check.getScript());
		return div;
	}

}
